package com.anolesoft.yr.mbus.sup.service.impl;

import com.anolesoft.yr.exception.ServiceException;
import com.anolesoft.yr.mbus.sup.dto.SupBaseDTO;
import com.anolesoft.yr.mbus.sup.entity.SupBaseDO;
import com.anolesoft.yr.mbus.sup.mapper.SupBaseMapper;
import com.anolesoft.yr.mbus.sup.service.SupBaseService;
import com.anolesoft.yr.util.CommonUtils;
import com.anolesoft.yr.util.CustomBeanUtils;
import com.anolesoft.yr.util.PageData;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author zhj
 * @date 2020/8/11 9:51
 */
@Service("supBaseServiceImpl")
public class SupBaseServiceImpl implements SupBaseService {
    @Autowired
    private SupBaseMapper supBaseMapper;

    private void checkUnique(SupBaseDTO supBaseDTO, boolean isModify) {
        String objuid = supBaseDTO.getObjuid();
        String supCode = supBaseDTO.getSupCode();
        String supName = supBaseDTO.getSupName();
        if (isModify) {
            if (supBaseMapper.checkUniqueForSupCodeUpdate(supCode, objuid) > 0) {
                throw new ServiceException("供应商编号已存在");
            }
            if (supBaseMapper.checkUniqueForSupNameUpdate(supName, objuid) > 0) {
                throw new ServiceException("供应商名称已存在");
            }
        } else {
            if (supBaseMapper.checkUniqueForSupCode(supCode) > 0) {
                throw new ServiceException("供应商编号已存在");
            }
            if (supBaseMapper.checkUniqueForSupName(supName) > 0) {
                throw new ServiceException("供应商名称已存在");
            }
        }
    }

    @Transactional
    @Override
    public int create(SupBaseDTO supBaseDTO) {
        checkUnique(supBaseDTO, false);
        return supBaseMapper.insert(SupBaseDO.builder()
                .supAddress(supBaseDTO.getSupAddress())
                .supOtherName(supBaseDTO.getSupOtherName())
                .supName(supBaseDTO.getSupName())
                .supCode(supBaseDTO.getSupCode())
                .baseRegionUid(supBaseDTO.getBaseRegionUid())
                .factoryCode(supBaseDTO.getFactoryCode())
                .modifyUserUid(supBaseDTO.getModifyUserUid())
                .taxNumber(supBaseDTO.getTaxNumber())
                .remark(supBaseDTO.getRemark())
                .objuid(supBaseDTO.getObjuid())
                .legalPerson(supBaseDTO.getLegalPerson())
                .faxNumber(supBaseDTO.getFaxNumber())
                .establishTime(supBaseDTO.getEstablishTime())
                .email(supBaseDTO.getEmail())
                .createUserUid(supBaseDTO.getCreateUserUid())
                .contactPerson(supBaseDTO.getContactPerson())
                .contactNumber(supBaseDTO.getContactNumber())
                .supWebsite(supBaseDTO.getSupWebsite())
                .companyType(supBaseDTO.getCompanyType())
                .supGrade(supBaseDTO.getSupGrade())
                .bank(supBaseDTO.getBank())
                .account(supBaseDTO.getAccount())
                .build());
    }

    @Transactional
    @Override
    public int modify(SupBaseDTO supBaseDTO) {
        checkUnique(supBaseDTO, true);
        SupBaseDO supBaseDO = supBaseMapper.selectOneById(supBaseDTO.getObjuid());
        if(supBaseDO == null){
            supBaseDO = SupBaseDO.builder().build();
        }
        supBaseDO.setSupAddress(supBaseDTO.getSupAddress());
        supBaseDO.setSupOtherName(supBaseDTO.getSupOtherName());
        supBaseDO.setSupName(supBaseDTO.getSupName());
        supBaseDO.setSupCode(supBaseDTO.getSupCode());
        supBaseDO.setBaseRegionUid(supBaseDTO.getBaseRegionUid());
        supBaseDO.setFactoryCode(supBaseDTO.getFactoryCode());
        supBaseDO.setModifyUserUid(supBaseDTO.getModifyUserUid());
        supBaseDO.setTaxNumber(supBaseDTO.getTaxNumber());
        supBaseDO.setRemark(supBaseDTO.getRemark());
        supBaseDO.setLegalPerson(supBaseDTO.getLegalPerson());
        supBaseDO.setFaxNumber(supBaseDTO.getFaxNumber());
        supBaseDO.setEstablishTime(supBaseDTO.getEstablishTime());
        supBaseDO.setEmail(supBaseDTO.getEmail());
        supBaseDO.setContactPerson(supBaseDTO.getContactPerson());
        supBaseDO.setContactNumber(supBaseDTO.getContactNumber());
        supBaseDO.setSupWebsite(supBaseDTO.getSupWebsite());
        supBaseDO.setCompanyType(supBaseDTO.getCompanyType());
        supBaseDO.setSupGrade(supBaseDTO.getSupGrade());
        supBaseDO.setBank(supBaseDTO.getBank());
        supBaseDO.setAccount(supBaseDTO.getAccount());

        return supBaseMapper.update(supBaseDO);
    }

    @Transactional
    @Override
    public int remove(String id) {
        return supBaseMapper.delete(id);
    }

    @Transactional
    @Override
    public int removeBatch(List<String> ids) {
        int res = 0;
        for (String id : ids) {
            res += supBaseMapper.delete(id);
        }
        return res;
    }

    @Override
    public List<SupBaseDTO> selectAll() {
        return supBaseMapper.selectAll().stream().map(t -> CustomBeanUtils.supBaseDO2DTO(t)).collect(Collectors.toList());
    }

    @Override
    public PageData<List<SupBaseDTO>> selectAll(Integer limit, Integer curr) {
        //return supBaseMapper.selectAll(new Page<>(curr, limit)).stream().map(t -> do2dto(t)).collect(Collectors.toList());
        Page<SupBaseDO> page = new Page<>(curr, limit);
        List<SupBaseDO> supBaseDOS = supBaseMapper.selectPageAll(page);
        List<SupBaseDTO> supBaseDTOS = supBaseDOS.stream().map(t -> CustomBeanUtils.supBaseDO2DTO(t)).collect(Collectors.toList());
        return new PageData<>(((int) page.getTotal()), supBaseDTOS);
    }

    @Override
    public Optional<SupBaseDTO> selectOneById(String id) {
        SupBaseDO supBaseDO = supBaseMapper.selectOneById(id);
        if (supBaseDO != null) {
            return Optional.of(CustomBeanUtils.supBaseDO2DTO(supBaseDO));
        }
        return Optional.empty();
    }

    @Override
    public List<SupBaseDTO> selectList(SupBaseDTO supBaseDTO) {
        SupBaseDO supBaseDO = buildCondition(supBaseDTO);
        return supBaseMapper.selectList(supBaseDO).stream().map(t -> CustomBeanUtils.supBaseDO2DTO(t)).collect(Collectors.toList());
    }

    @Override
    public PageData<List<SupBaseDTO>> selectList(SupBaseDTO supBaseDTO, Integer limit, Integer curr) {
        SupBaseDO supBaseDO = buildCondition(supBaseDTO);
        //return supBaseMapper.selectList(supBaseDO, new Page<>(curr, limit)).stream().map(t -> do2dto(t)).collect(Collectors.toList());
        Page<SupBaseDO> page = new Page<>(curr, limit);
        List<SupBaseDO> supBaseDOS = supBaseMapper.selectPageList(supBaseDO, page);
        List<SupBaseDTO> supBaseDTOS = supBaseDOS.stream().map(t -> CustomBeanUtils.supBaseDO2DTO(t)).collect(Collectors.toList());
        return new PageData<>(((int) page.getTotal()), supBaseDTOS);
    }

    @Override
    public PageData<List<SupBaseDTO>> selectCombox(SupBaseDTO supBaseDTO, Integer limit, Integer curr) {
        SupBaseDO supBaseDO = SupBaseDO.builder()
                .supOtherName(CommonUtils.stringNull(supBaseDTO.getSupOtherName()))
                .supName(CommonUtils.stringNull(supBaseDTO.getSupName()))
                .supCode(CommonUtils.stringNull(supBaseDTO.getSupCode()))
                .build();
        Page<SupBaseDO> page = new Page<>(curr, limit);
        List<SupBaseDO> supBaseDOS = supBaseMapper.selectCombox(supBaseDO, page);
        List<SupBaseDTO> supBaseDTOS = supBaseDOS.stream().map(CustomBeanUtils::supBaseDO2DTO).collect(Collectors.toList());
        return new PageData<>(((int) page.getTotal()), supBaseDTOS);
    }

//    private SupBaseDTO do2dto(SupBaseDO t) {
//        BaseRegionDO region = t.getRegion();
//        BaseRegionDTO baseRegionDTO = null;
//        if (region != null) {
//            baseRegionDTO = BaseRegionDTO.builder()
//                    .remark(region.getRemark())
//                    .parentUid(StringUtils.isEmpty(region.getParentUid()) ? "-" : region.getParentUid())
//                    .modifyUserUid(region.getModifyUserUid())
//                    .deleteFlag(region.getDeleteFlag())
//                    .createUserUid(region.getCreateUserUid())
//                    .regionCode(region.getRegionCode())
//                    .regionLevel(region.getRegionLevel())
//                    .regionName(region.getRegionName())
//                    .factoryCode(region.getFactoryCode())
//                    .objuid(region.getObjuid())
//                    .build();
//        } else {
//            baseRegionDTO = new BaseRegionDTO();
//        }
//        List<BaseContactDTO> baseContactDOTS = t.getContacts().stream().map(baseContactDTO -> BaseContactDTO.builder()
//                .contactNumber(baseContactDTO.getContactNumber())
//                .contactPerson(baseContactDTO.getContactPerson())
//                .createTime(baseContactDTO.getCreateTime())
//                .createUserUid(baseContactDTO.getCreateUserUid())
//                .crmAddress(baseContactDTO.getCrmAddress())
//                .deleteFlag(baseContactDTO.getDeleteFlag())
//                .factoryCode(baseContactDTO.getFactoryCode())
//                .modifyTime(baseContactDTO.getModifyTime())
//                .modifyUserUid(baseContactDTO.getModifyUserUid())
//                .objuid(baseContactDTO.getObjuid())
//                .postcode(baseContactDTO.getPostcode())
//                .remark(baseContactDTO.getRemark())
//                .targetUid(baseContactDTO.getTargetUid())
//                .type(baseContactDTO.getType())
//                .build()).collect(Collectors.toList());
//        return SupBaseDTO.builder()
//                .account(t.getAccount())
//                .bank(t.getBank())
//                .baseRegionUid(t.getBaseRegionUid())
//                .supAddress(t.getSupAddress())
//                .supCode(t.getSupCode())
//                .supGrade(t.getSupGrade())
//                .supName(t.getSupName())
//                .supOtherName(t.getSupOtherName())
//                .companyType(t.getCompanyType())
//                .supWebsite(t.getSupWebsite())
//                .contactNumber(t.getContactNumber())
//                .contactPerson(t.getContactPerson())
//                .createTime(t.getCreateTime())
//                .createUserUid(t.getCreateUserUid())
//                .deleteFlag(t.getDeleteFlag())
//                .email(t.getEmail())
//                .establishTime(t.getEstablishTime())
//                .factoryCode(t.getFactoryCode())
//                .faxNumber(t.getFaxNumber())
//                .legalPerson(t.getLegalPerson())
//                .modifyTime(t.getModifyTime())
//                .modifyUserUid(t.getModifyUserUid())
//                .objuid(t.getObjuid())
//                .region(baseRegionDTO)
//                .remark(t.getRemark())
//                .taxNumber(t.getTaxNumber())
//                .contacts(baseContactDOTS)
//                .build();
//    }

    private SupBaseDO buildCondition(SupBaseDTO supBaseDTO) {
        return SupBaseDO.builder()
                .factoryCode(CommonUtils.stringNull(supBaseDTO.getFactoryCode()))
                .baseRegionUid(CommonUtils.stringNull(supBaseDTO.getBaseRegionUid()))
                .supCode(CommonUtils.warpStringNull(supBaseDTO.getSupCode()))
                .supName(CommonUtils.warpStringNull(supBaseDTO.getSupName()))
                .supOtherName(CommonUtils.warpStringNull(supBaseDTO.getSupOtherName()))
                .supAddress(CommonUtils.warpStringNull(supBaseDTO.getSupAddress()))
                .objuid(CommonUtils.stringNull(supBaseDTO.getObjuid()))
                .build();
    }
}
